package cn.otrue.patienthealthmanager.receiver;

import java.util.List;
import java.util.Map;

import android.app.ActivityManager;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.util.Log;
import cn.otrue.patienthealthmanager.HealthApplication;
import cn.otrue.patienthealthmanager.R;
import cn.otrue.patienthealthmanager.activity.CenterMessageActivity;
import cn.otrue.patienthealthmanager.activity.DoctorChatActivity;
import cn.otrue.patienthealthmanager.activity.MainActivity;
import cn.otrue.patienthealthmanager.activity.QuestionnaireList;
import cn.otrue.patienthealthmanager.fragment.MainDataPickFragment;
import cn.otrue.patienthealthmanager.utils.CommonUtil;
import cn.otrue.patienthealthmanager.utils.MyConst;
import cn.otrue.patienthealthmanager.utils.PushUtils;

import com.baidu.frontia.api.FrontiaPushMessageReceiver;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

/**
 * Push消息处理receiver。请编写您需要的回调函数， 一般来说： onBind是必须的，用来处理startWork返回值；
 * onMessage用来接收透传消息； onSetTags、onDelTags、onListTags是tag相关操作的回调；
 * onNotificationClicked在通知被点击时回调； onUnbind是stopWork接口的返回值回调
 * 
 * 返回值中的errorCode，解释如下： 0 - Success 10001 - Network Problem 30600 - Internal
 * Server Error 30601 - Method Not Allowed 30602 - Request Params Not Valid
 * 30603 - Authentication Failed 30604 - Quota Use Up Payment Required 30605 -
 * Data Required Not Found 30606 - Request Time Expires Timeout 30607 - Channel
 * Token Timeout 30608 - Bind Relation Not Found 30609 - Bind Number Too Many
 * 
 * 当您遇到以上返回错误时，如果解释不了您的问题，请用同一请求的返回值requestId和errorCode联系我们追查问题。
 * 
 */
public class MyPushMessageReceiver extends FrontiaPushMessageReceiver {
	/** TAG to Log */
	public static final String TAG = MyPushMessageReceiver.class
			.getSimpleName();

	/**
	 * 调用PushManager.startWork后，sdk将对push
	 * server发起绑定请求，这个过程是异步的。绑定请求的结果通过onBind返回。 如果您需要用单播推送，需要把这里获取的channel
	 * id和user id上传到应用server中，再调用server接口用channel id和user id给单个手机或者用户推送。
	 * 
	 * @param context
	 *            BroadcastReceiver的执行Context
	 * @param errorCode
	 *            绑定接口返回值，0 - 成功
	 * @param appid
	 *            应用id。errorCode非0时为null
	 * @param userId
	 *            应用user id。errorCode非0时为null
	 * @param channelId
	 *            应用channel id。errorCode非0时为null
	 * @param requestId
	 *            向服务端发起的请求id。在追查问题时有用；
	 * @return none
	 */
	@Override
	public void onBind(Context context, int errorCode, String appid,
			String userId, String channelId, String requestId) {
		String responseString = "onBind errorCode=" + errorCode + " appid="
				+ appid + " userId=" + userId + " channelId=" + channelId
				+ " requestId=" + requestId;
		Log.e("TAG", "channelId" + channelId);
		Log.e("TAG", "responseString" + responseString);
		// 绑定成功，设置已绑定flag，可以有效的减少不必要的绑定请求
		if (errorCode == 0) {
			PushUtils.setBind(context, true);
			MyConst.CHANNELID = channelId;

		}

		// 上传channelId到服务器

	}

	/**
	 * 接收透传消息的函数。
	 * 
	 * @param context
	 *            上下文
	 * @param message
	 *            推送的消息
	 * @param customContentString
	 *            自定义内容,为空或者json字符串
	 */
	@Override
	public void onMessage(Context context, String message,
			String customContentString) {
		// onNotificationArrived title="患者血糖推送" description="患者血糖推送"
		// custom_content={"data":{"pushType":"1","bloodSugar":"1.6"}}

		Log.e("TAG", message + "   " + customContentString);
		Gson gson = new Gson();
		try {
			Map<String, Object> messageMap = gson.fromJson(message,
					new TypeToken<Map<String, Object>>() {
					}.getType());

			Map<String, String> custom_content = gson.fromJson(gson
					.toJson(((Map<String, String>) messageMap
							.get("custom_content")).get("data")),
					new TypeToken<Map<String, String>>() {
					}.getType());

			// 文本
			String title = custom_content.get("title").toString();
			// 内容
			String content = custom_content.get("content").toString();
			String typeStr = custom_content.get("typeid").toString();
			int type = Integer.parseInt(typeStr.substring(0,
					typeStr.lastIndexOf(".")));
			if (type != MyConst.SUGAR_PLUS) {
				if (isRunningForeground(HealthApplication.getInstance())) {

					if (MyConst.activity instanceof MainActivity) {
						MainActivity.pushNum++;
						((MainActivity) MyConst.activity).getPush();
					}

				}
			}
			showMessage(type, title, content, custom_content);
		} catch (Exception e) {

		}

	}

	public static void showMessage(int type, String title, String content,
			Map<String, String> other) {

		// 定义NotificationManager
		String ns = Context.NOTIFICATION_SERVICE;
		NotificationManager mNotificationManager = (NotificationManager) HealthApplication
				.getInstance().getSystemService(ns);
		// 定义通知栏展现的内容信息
		int icon = R.drawable.ic_launcher;
		// 通知栏标题
		CharSequence tickerText = title;
		long when = System.currentTimeMillis();
		// 定义下拉通知栏时要展现的内容信息
		Context context = HealthApplication.getInstance();
		// 通知栏详细标题
		CharSequence contentTitle = title;
		// 通知栏详细内容
		CharSequence contentText = content;

		Intent notificationIntent = new Intent();
		notificationIntent.setClass(context, CenterMessageActivity.class);
		switch (type) {
		case -1:

			String from = other.get("from");

			notificationIntent.setClass(context, DoctorChatActivity.class);
			notificationIntent.putExtra("from", from);
			break;
		case MyConst.SUGAR_PLUS:

			ActivityManager am = (ActivityManager) context
					.getSystemService(Context.ACTIVITY_SERVICE);
			ComponentName cn = am.getRunningTasks(2).get(0).topActivity;

			// 当前的Activity名称
			String className = cn.getClassName();
			String rclassName = className
					.substring(className.lastIndexOf(".") + 1);
			// 保存的Activity名称
			String saveActivty = CommonUtil
					.getActivityNameByContext(MyConst.activity);

			if (rclassName.equals(saveActivty)) {

				if (MyConst.fragment instanceof MainDataPickFragment) {
					((MainDataPickFragment) MyConst.fragment)
							.setSugarData(other.get("bloodSugar"),
									other.get("measuringTime"));
				}
			}
			break;
		case MyConst.TYPEID_questionnaire:
			notificationIntent.setClass(context, QuestionnaireList.class);
			break;

		default:

			break;
		}

		Notification notification = new Notification(icon, tickerText, when);
		notification.flags |= Notification.FLAG_AUTO_CANCEL; // 在通知栏上点击此通知后自动清除此通知
		PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
				notificationIntent, 0);
		notification.setLatestEventInfo(context, contentTitle, contentText,
				contentIntent);

		// 用mNotificationManager的notify方法通知用户生成标题栏消息通知
		mNotificationManager.notify(1, notification);
	}

	/**
	 * 接收通知点击的函数。注：推送通知被用户点击前，应用无法通过接口获取通知的内容。
	 * 
	 * @param context
	 *            上下文
	 * @param title
	 *            推送的通知的标题
	 * @param description
	 *            推送的通知的描述
	 * @param customContentString
	 *            自定义内容，为空或者json字符串
	 */
	@Override
	public void onNotificationClicked(Context context, String title,
			String description, String customContentString) {
		Intent intent = new Intent();
		intent.setClass(context.getApplicationContext(),
				CenterMessageActivity.class);
		intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
		context.getApplicationContext().startActivity(intent);

	}

	/**
	 * setTags() 的回调函数。
	 * 
	 * @param context
	 *            上下文
	 * @param errorCode
	 *            错误码。0表示某些tag已经设置成功；非0表示所有tag的设置均失败。
	 * @param successTags
	 *            设置成功的tag
	 * @param failTags
	 *            设置失败的tag
	 * @param requestId
	 *            分配给对云推送的请求的id
	 */
	@Override
	public void onSetTags(Context context, int errorCode,
			List<String> sucessTags, List<String> failTags, String requestId) {
		String responseString = "onSetTags errorCode=" + errorCode
				+ " sucessTags=" + sucessTags + " failTags=" + failTags
				+ " requestId=" + requestId;
		Log.d(TAG, responseString);

		// Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
	}

	/**
	 * delTags() 的回调函数。
	 * 
	 * @param context
	 *            上下文
	 * @param errorCode
	 *            错误码。0表示某些tag已经删除成功；非0表示所有tag均删除失败。
	 * @param successTags
	 *            成功删除的tag
	 * @param failTags
	 *            删除失败的tag
	 * @param requestId
	 *            分配给对云推送的请求的id
	 */
	@Override
	public void onDelTags(Context context, int errorCode,
			List<String> sucessTags, List<String> failTags, String requestId) {
		String responseString = "onDelTags errorCode=" + errorCode
				+ " sucessTags=" + sucessTags + " failTags=" + failTags
				+ " requestId=" + requestId;
		Log.d(TAG, responseString);

		// Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
	}

	/**
	 * listTags() 的回调函数。
	 * 
	 * @param context
	 *            上下文
	 * @param errorCode
	 *            错误码。0表示列举tag成功；非0表示失败。
	 * @param tags
	 *            当前应用设置的所有tag。
	 * @param requestId
	 *            分配给对云推送的请求的id
	 */
	@Override
	public void onListTags(Context context, int errorCode, List<String> tags,
			String requestId) {
		String responseString = "onListTags errorCode=" + errorCode + " tags="
				+ tags;
		Log.d(TAG, responseString);

		// Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
	}

	/**
	 * PushManager.stopWork() 的回调函数。
	 * 
	 * @param context
	 *            上下文
	 * @param errorCode
	 *            错误码。0表示从云推送解绑定成功；非0表示失败。
	 * @param requestId
	 *            分配给对云推送的请求的id
	 */
	@Override
	public void onUnbind(Context context, int errorCode, String requestId) {
		String responseString = "onUnbind errorCode=" + errorCode
				+ " requestId = " + requestId;
		Log.d(TAG, responseString);

		// 解绑定成功，设置未绑定flag，
		if (errorCode == 0) {
			PushUtils.setBind(context, false);
		}
		// Demo更新界面展示代码，应用请在这里加入自己的处理逻辑
	}

	private boolean isRunningForeground(Context context) {

		ActivityManager am = (ActivityManager) context
				.getSystemService(Context.ACTIVITY_SERVICE);
		ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
		String currentPackageName = cn.getPackageName();
		if (!TextUtils.isEmpty(currentPackageName)
				&& currentPackageName.equals(context.getPackageName())) {
			return true;
		}

		return false;
	}

}
